<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>高级技巧</title>
</head>

<body>
    <script>
        window.onload = function () {
            // 安全的类型检测
            (function () {

                // 在任何值上调用Object原生的toString方法，都会返回一个[object NativeConstructorname]
                // 格式的字符串，每个类在内部都有一个[[Class]]属性，这个属性中就指定了上述字符串中的构造函数名
                var o = {
                    name: "name"
                }
                console.log(Object.prototype.toString.call(o)); //[object Object]

                var a = [1, 2, 3];
                console.log(Object.prototype.toString.call(a)); //[object Array]

                var b = '2qdqwdq';
                console.log(Object.prototype.toString.call(b)); //[object String]

                var c = /^\d+$/g;
                console.log(Object.prototype.toString.call(c)); //[object RegExp]

                var d = function () {};
                console.log(Object.prototype.toString.call(d)); //[object Function]

                // 这一技巧也广泛应用于检测原生的JSON对象，Object的toString方法不能检测非原生构造函数的构造函数名
                // 因此开发人员自定义的任何构造函数都将返回[object Object]
                // 有些js库中有类似的代码：
                var isNativeJson = window.JSON && Object.prototype.toString.call(JSON) === "[object JSON]";
            })();

            (function () {
                
            })();
        }
    </script>
</body>

</html>